{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Converting efficientnet-lite from Tensorflow to ONNX"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Google recently [published a new flavor of efficientnet models](\n",
    "https://blog.tensorflow.org/2020/03/higher-accuracy-on-vision-models-with-efficientnet-lite.html) that show great performance and accuracy on all mobile CPU/GPU/EdgeTPU devices. The models are found [here](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite). \n",
    "This tutorial shows how to convert them to ONNX.\n",
    "\n",
    "To start, we setup a few environment variables and download the pre-trained model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "HOME = os.getcwd()\n",
    "MODEL = \"efficientnet-lite4\"\n",
    "os.environ['PYTHONPATH'] = os.path.join(HOME, \"tpu\")\n",
    "os.environ['MODEL'] = MODEL\n",
    "os.environ['CUDA_VISIBLE_DEVICES'] = \"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%cd {HOME}\n",
    "!git clone https://github.com/tensorflow/tpu\n",
    "%cd {HOME}/tpu/models/official/efficientnet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "!wget https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/lite/$MODEL.tar.gz\n",
    "!tar zxf $MODEL.tar.gz\n",
    "!wget -q https://upload.wikimedia.org/wikipedia/commons/f/fe/Giant_Panda_in_Beijing_Zoo_1.JPG -O panda.jpg\n",
    "!wget -q https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/eval_data/labels_map.txt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run a evaluation on tensorflow/cpu:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predicted class for image panda.jpg: \n",
      "  -> top_0 (85.58%): lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens  \n",
      "  -> top_1 (0.26%): cheetah, chetah, Acinonyx jubatus  \n",
      "  -> top_2 (0.24%): brown bear, bruin, Ursus arctos  \n",
      "  -> top_3 (0.16%): African elephant, Loxodonta africana  \n",
      "  -> top_4 (0.15%): American black bear, black bear, Ursus americanus, Euarctos americanus  \n"
     ]
    }
   ],
   "source": [
    "!python eval_ckpt_main.py --model_name=$MODEL --ckpt_dir=$MODEL --example_img=panda.jpg --labels_map_file=labels_map.txt --include_background_label"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use the efficientnet ```export_model.py``` script to export the model as saved_model which makes exporting to ONNX very simple:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I0317 04:45:13.062742 140590807156480 efficientnet_lite_builder.py:100] global_params= GlobalParams(batch_norm_momentum=0.99, batch_norm_epsilon=0.001, dropout_rate=0.3, data_format='channels_last', num_classes=1000, width_coefficient=1.4, depth_coefficient=1.8, depth_divisor=8, min_depth=None, survival_prob=0.8, relu_fn=<function relu6 at 0x7fdd83fbcea0>, batch_norm=<class 'utils.BatchNormalization'>, use_se=False, local_pooling=True, condconv_num_experts=None, clip_projection_output=False, blocks_args=['r1_k3_s11_e1_i32_o16_se0.25', 'r2_k3_s22_e6_i16_o24_se0.25', 'r2_k5_s22_e6_i24_o40_se0.25', 'r3_k3_s22_e6_i40_o80_se0.25', 'r3_k5_s11_e6_i80_o112_se0.25', 'r4_k5_s22_e6_i112_o192_se0.25', 'r1_k3_s11_e6_i192_o320_se0.25'], fix_head_stem=True)\n",
      "I0317 04:45:13.116612 140590807156480 efficientnet_model.py:153] round_filter input=32 output=48\n",
      "I0317 04:45:13.116733 140590807156480 efficientnet_model.py:153] round_filter input=16 output=24\n",
      "I0317 04:45:13.119245 140590807156480 efficientnet_model.py:153] round_filter input=16 output=24\n",
      "I0317 04:45:13.119314 140590807156480 efficientnet_model.py:153] round_filter input=24 output=32\n",
      "I0317 04:45:13.128279 140590807156480 efficientnet_model.py:153] round_filter input=24 output=32\n",
      "I0317 04:45:13.128348 140590807156480 efficientnet_model.py:153] round_filter input=40 output=56\n",
      "I0317 04:45:13.137309 140590807156480 efficientnet_model.py:153] round_filter input=40 output=56\n",
      "I0317 04:45:13.137379 140590807156480 efficientnet_model.py:153] round_filter input=80 output=112\n",
      "I0317 04:45:13.150849 140590807156480 efficientnet_model.py:153] round_filter input=80 output=112\n",
      "I0317 04:45:13.150932 140590807156480 efficientnet_model.py:153] round_filter input=112 output=160\n",
      "I0317 04:45:13.164771 140590807156480 efficientnet_model.py:153] round_filter input=112 output=160\n",
      "I0317 04:45:13.164845 140590807156480 efficientnet_model.py:153] round_filter input=192 output=272\n",
      "I0317 04:45:13.182756 140590807156480 efficientnet_model.py:153] round_filter input=192 output=272\n",
      "I0317 04:45:13.182835 140590807156480 efficientnet_model.py:153] round_filter input=320 output=448\n",
      "I0317 04:45:15.719593 140590807156480 api.py:567] Built stem layers with output shape: (1, 112, 112, 32)\n",
      "I0317 04:45:17.895972 140590807156480 api.py:567] block_0 survival_prob: 1.0\n",
      "I0317 04:45:18.603083 140590807156480 api.py:567] Block input: efficientnet-lite4/model/stem/Relu6:0 shape: (1, 112, 112, 32)\n",
      "I0317 04:45:18.610922 140590807156480 api.py:567] Block input depth: 48 output depth: 24\n",
      "I0317 04:45:18.638564 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_0/Relu6:0 shape: (1, 112, 112, 32)\n",
      "I0317 04:45:18.666830 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_0/Identity:0 shape: (1, 112, 112, 24)\n",
      "I0317 04:45:18.715108 140590807156480 api.py:567] block_1 survival_prob: 0.9933333333333333\n",
      "I0317 04:45:18.723168 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_0/Identity:0 shape: (1, 112, 112, 24)\n",
      "I0317 04:45:18.730878 140590807156480 api.py:567] Block input depth: 24 output depth: 32\n",
      "I0317 04:45:18.760163 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_1/Relu6:0 shape: (1, 112, 112, 144)\n",
      "I0317 04:45:18.789498 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_1/Relu6_1:0 shape: (1, 56, 56, 144)\n",
      "I0317 04:45:18.819620 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_1/Identity:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:18.828456 140590807156480 api.py:567] block_2 survival_prob: 0.9866666666666667\n",
      "I0317 04:45:18.836339 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_1/Identity:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:18.844154 140590807156480 api.py:567] Block input depth: 32 output depth: 32\n",
      "I0317 04:45:18.874791 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_2/Relu6:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:18.906245 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_2/Relu6_1:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:19.045265 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_2/Add:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:19.054164 140590807156480 api.py:567] block_3 survival_prob: 0.98\n",
      "I0317 04:45:19.062103 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_2/Add:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:19.069805 140590807156480 api.py:567] Block input depth: 32 output depth: 32\n",
      "I0317 04:45:19.101838 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_3/Relu6:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:19.134559 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_3/Relu6_1:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:19.168589 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_3/Add:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:19.177538 140590807156480 api.py:567] block_4 survival_prob: 0.9733333333333334\n",
      "I0317 04:45:19.185509 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_3/Add:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:19.193212 140590807156480 api.py:567] Block input depth: 32 output depth: 32\n",
      "I0317 04:45:19.227258 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_4/Relu6:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:19.261800 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_4/Relu6_1:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:19.296964 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_4/Add:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:19.306012 140590807156480 api.py:567] block_5 survival_prob: 0.9666666666666667\n",
      "I0317 04:45:19.314208 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_4/Add:0 shape: (1, 56, 56, 32)\n",
      "I0317 04:45:19.321954 140590807156480 api.py:567] Block input depth: 32 output depth: 56\n",
      "I0317 04:45:19.357403 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_5/Relu6:0 shape: (1, 56, 56, 192)\n",
      "I0317 04:45:19.393963 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_5/Relu6_1:0 shape: (1, 28, 28, 192)\n",
      "I0317 04:45:19.431034 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_5/Identity:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.439906 140590807156480 api.py:567] block_6 survival_prob: 0.96\n",
      "I0317 04:45:19.447812 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_5/Identity:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.455622 140590807156480 api.py:567] Block input depth: 56 output depth: 56\n",
      "I0317 04:45:19.492807 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_6/Relu6:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.531353 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_6/Relu6_1:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.570957 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_6/Add:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.579856 140590807156480 api.py:567] block_7 survival_prob: 0.9533333333333334\n",
      "I0317 04:45:19.587775 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_6/Add:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.595458 140590807156480 api.py:567] Block input depth: 56 output depth: 56\n",
      "I0317 04:45:19.634931 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_7/Relu6:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.674918 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_7/Relu6_1:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.715047 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_7/Add:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.724665 140590807156480 api.py:567] block_8 survival_prob: 0.9466666666666667\n",
      "I0317 04:45:19.732570 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_7/Add:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.740266 140590807156480 api.py:567] Block input depth: 56 output depth: 56\n",
      "I0317 04:45:19.781676 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_8/Relu6:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.823185 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_8/Relu6_1:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.864949 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_8/Add:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.874733 140590807156480 api.py:567] block_9 survival_prob: 0.9400000000000001\n",
      "I0317 04:45:19.882672 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_8/Add:0 shape: (1, 28, 28, 56)\n",
      "I0317 04:45:19.890336 140590807156480 api.py:567] Block input depth: 56 output depth: 112\n",
      "I0317 04:45:19.933387 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_9/Relu6:0 shape: (1, 28, 28, 336)\n",
      "I0317 04:45:19.977168 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_9/Relu6_1:0 shape: (1, 14, 14, 336)\n",
      "I0317 04:45:20.022493 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_9/Identity:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.031920 140590807156480 api.py:567] block_10 survival_prob: 0.9333333333333333\n",
      "I0317 04:45:20.039810 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_9/Identity:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.047452 140590807156480 api.py:567] Block input depth: 112 output depth: 112\n",
      "I0317 04:45:20.091966 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_10/Relu6:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.137222 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_10/Relu6_1:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.183222 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_10/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.192143 140590807156480 api.py:567] block_11 survival_prob: 0.9266666666666667\n",
      "I0317 04:45:20.200069 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_10/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.207746 140590807156480 api.py:567] Block input depth: 112 output depth: 112\n",
      "I0317 04:45:20.254011 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_11/Relu6:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.303129 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_11/Relu6_1:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.351128 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_11/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.360038 140590807156480 api.py:567] block_12 survival_prob: 0.92\n",
      "I0317 04:45:20.367931 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_11/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.375695 140590807156480 api.py:567] Block input depth: 112 output depth: 112\n",
      "I0317 04:45:20.423958 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_12/Relu6:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.471994 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_12/Relu6_1:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.521208 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_12/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.530177 140590807156480 api.py:567] block_13 survival_prob: 0.9133333333333333\n",
      "I0317 04:45:20.538881 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_12/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.546572 140590807156480 api.py:567] Block input depth: 112 output depth: 112\n",
      "I0317 04:45:20.596050 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_13/Relu6:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.646432 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_13/Relu6_1:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.697596 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_13/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.706486 140590807156480 api.py:567] block_14 survival_prob: 0.9066666666666667\n",
      "I0317 04:45:20.714402 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_13/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.722100 140590807156480 api.py:567] Block input depth: 112 output depth: 112\n",
      "I0317 04:45:20.773102 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_14/Relu6:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.824693 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_14/Relu6_1:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:20.877361 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_14/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.886309 140590807156480 api.py:567] block_15 survival_prob: 0.9\n",
      "I0317 04:45:20.895032 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_14/Add:0 shape: (1, 14, 14, 112)\n",
      "I0317 04:45:20.902743 140590807156480 api.py:567] Block input depth: 112 output depth: 160\n",
      "I0317 04:45:20.955559 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_15/Relu6:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:21.008883 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_15/Relu6_1:0 shape: (1, 14, 14, 672)\n",
      "I0317 04:45:21.062881 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_15/Identity:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.071828 140590807156480 api.py:567] block_16 survival_prob: 0.8933333333333333\n",
      "I0317 04:45:21.079703 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_15/Identity:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.087451 140590807156480 api.py:567] Block input depth: 160 output depth: 160\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I0317 04:45:21.141554 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_16/Relu6:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.195437 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_16/Relu6_1:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.252286 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_16/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.261178 140590807156480 api.py:567] block_17 survival_prob: 0.8866666666666667\n",
      "I0317 04:45:21.269101 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_16/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.276744 140590807156480 api.py:567] Block input depth: 160 output depth: 160\n",
      "I0317 04:45:21.332792 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_17/Relu6:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.390112 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_17/Relu6_1:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.447642 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_17/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.456686 140590807156480 api.py:567] block_18 survival_prob: 0.88\n",
      "I0317 04:45:21.464611 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_17/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.472282 140590807156480 api.py:567] Block input depth: 160 output depth: 160\n",
      "I0317 04:45:21.529984 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_18/Relu6:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.588109 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_18/Relu6_1:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.647364 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_18/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.656372 140590807156480 api.py:567] block_19 survival_prob: 0.8733333333333334\n",
      "I0317 04:45:21.665000 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_18/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.672696 140590807156480 api.py:567] Block input depth: 160 output depth: 160\n",
      "I0317 04:45:21.732334 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_19/Relu6:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.792536 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_19/Relu6_1:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:21.854197 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_19/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.864293 140590807156480 api.py:567] block_20 survival_prob: 0.8666666666666667\n",
      "I0317 04:45:21.872680 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_19/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:21.880745 140590807156480 api.py:567] Block input depth: 160 output depth: 160\n",
      "I0317 04:45:21.942413 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_20/Relu6:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:22.003703 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_20/Relu6_1:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:22.066048 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_20/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:22.075069 140590807156480 api.py:567] block_21 survival_prob: 0.86\n",
      "I0317 04:45:22.083034 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_20/Add:0 shape: (1, 14, 14, 160)\n",
      "I0317 04:45:22.090764 140590807156480 api.py:567] Block input depth: 160 output depth: 272\n",
      "I0317 04:45:22.153253 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_21/Relu6:0 shape: (1, 14, 14, 960)\n",
      "I0317 04:45:22.216972 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_21/Relu6_1:0 shape: (1, 7, 7, 960)\n",
      "I0317 04:45:22.340183 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_21/Identity:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:22.349377 140590807156480 api.py:567] block_22 survival_prob: 0.8533333333333334\n",
      "I0317 04:45:22.357272 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_21/Identity:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:22.365028 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n",
      "I0317 04:45:22.432191 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_22/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:22.499945 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_22/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:22.566263 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_22/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:22.575270 140590807156480 api.py:567] block_23 survival_prob: 0.8466666666666667\n",
      "I0317 04:45:22.584039 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_22/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:22.591916 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n",
      "I0317 04:45:22.660852 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_23/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:22.730422 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_23/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:22.798201 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_23/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:22.807118 140590807156480 api.py:567] block_24 survival_prob: 0.8400000000000001\n",
      "I0317 04:45:22.815037 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_23/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:22.822740 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n",
      "I0317 04:45:22.893360 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_24/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:22.964537 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_24/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.033960 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_24/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.043041 140590807156480 api.py:567] block_25 survival_prob: 0.8333333333333334\n",
      "I0317 04:45:23.051020 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_24/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.058711 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n",
      "I0317 04:45:23.130838 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_25/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.203328 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_25/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.275532 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_25/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.284543 140590807156480 api.py:567] block_26 survival_prob: 0.8266666666666667\n",
      "I0317 04:45:23.293209 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_25/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.300981 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n",
      "I0317 04:45:23.374962 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_26/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.449799 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_26/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.522344 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_26/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.531246 140590807156480 api.py:567] block_27 survival_prob: 0.8200000000000001\n",
      "I0317 04:45:23.539234 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_26/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.547058 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n",
      "I0317 04:45:23.621984 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_27/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.697803 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_27/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.771025 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_27/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.779946 140590807156480 api.py:567] block_28 survival_prob: 0.8133333333333334\n",
      "I0317 04:45:23.787839 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_27/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:23.795603 140590807156480 api.py:567] Block input depth: 272 output depth: 272\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I0317 04:45:23.872047 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_28/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:23.949152 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_28/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:24.024661 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_28/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:24.033358 140590807156480 api.py:567] block_29 survival_prob: 0.8066666666666666\n",
      "I0317 04:45:24.041232 140590807156480 api.py:567] Block input: efficientnet-lite4/model/blocks_28/Add:0 shape: (1, 7, 7, 272)\n",
      "I0317 04:45:24.048917 140590807156480 api.py:567] Block input depth: 272 output depth: 448\n",
      "I0317 04:45:24.127136 140590807156480 api.py:567] Expand: efficientnet-lite4/model/blocks_29/Relu6:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:24.205864 140590807156480 api.py:567] DWConv: efficientnet-lite4/model/blocks_29/Relu6_1:0 shape: (1, 7, 7, 1632)\n",
      "I0317 04:45:24.282718 140590807156480 api.py:567] Project: efficientnet-lite4/model/blocks_29/Identity:0 shape: (1, 7, 7, 448)\n",
      "INFO:tensorflow:Restoring parameters from efficientnet-lite4/model.ckpt\n",
      "I0317 04:45:25.960167 140590807156480 saver.py:1284] Restoring parameters from efficientnet-lite4/model.ckpt\n",
      "INFO:tensorflow:SavedModel written to: saved_model/saved_model.pb\n",
      "I0317 04:45:27.376586 140590807156480 builder_impl.py:426] SavedModel written to: saved_model/saved_model.pb\n",
      "Saved model written to saved_model\n"
     ]
    }
   ],
   "source": [
    "!python export_model.py --model_name=efficientnet-lite4 --ckpt_dir=efficientnet-lite4 --output_saved_model_dir=saved_model --output_tflite=/tmp/t"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A look at the saved_model shows us the inputs and outputs of the model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The given SavedModel SignatureDef contains the following input(s):\n",
      "  inputs['input'] tensor_info:\n",
      "      dtype: DT_FLOAT\n",
      "      shape: (1, 224, 224, 3)\n",
      "      name: images:0\n",
      "The given SavedModel SignatureDef contains the following output(s):\n",
      "  outputs['output'] tensor_info:\n",
      "      dtype: DT_FLOAT\n",
      "      shape: (1, 1000)\n",
      "      name: Softmax:0\n",
      "Method name is: tensorflow/serving/predict\n"
     ]
    }
   ],
   "source": [
    "!saved_model_cli show --dir saved_model --tag_set serve  --signature_def serving_default"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Install and run tf2onnx directly on the saved_model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install git+https://github.com/onnx/tensorflow-onnx\n",
    "!pip install onnxruntime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2020-03-17 04:45:48,897 - INFO - Using tensorflow=2.1.0, onnx=1.6.0, tf2onnx=1.6.0/f48281\n",
      "2020-03-17 04:45:48,897 - INFO - Using opset <onnx, 11>\n",
      "2020-03-17 04:45:57,747 - INFO - Optimizing ONNX model\n",
      "2020-03-17 04:46:08,488 - INFO - After optimization: Const -150 (609->459), Identity -33 (33->0), Reshape -30 (30->0), Transpose -395 (396->1)\n",
      "2020-03-17 04:46:08,533 - INFO - \n",
      "2020-03-17 04:46:08,533 - INFO - Successfully converted TensorFlow model saved_model to ONNX\n",
      "2020-03-17 04:46:08,927 - INFO - ONNX model is saved at efficientnet-lite4.onnx\n"
     ]
    }
   ],
   "source": [
    "!python -m tf2onnx.convert --opset 11 --fold_const --saved-model saved_model --output $MODEL.onnx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that we have the ONNX model we can write a quick demo using onnxruntime:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": []
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import numpy as np\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "import onnxruntime as rt\n",
    "import cv2\n",
    "import json\n",
    "\n",
    "labels = json.load(open(\"labels_map.txt\", \"r\"))\n",
    "\n",
    "\n",
    "def img_stats(a, name={}):\n",
    "    return {\n",
    "        \"name\": name,\n",
    "        \"size\": a.shape,\n",
    "        \"mean\": \"{:.2f}\".format(a.mean()),\n",
    "        \"std\": \"{:.2f}\".format(a.std()),\n",
    "        \"max\": a.max(),\n",
    "        \"min\": a.min(),\n",
    "        \"median\": \"{:.2f}\".format(np.median(a)),\n",
    "    }\n",
    "\n",
    "\n",
    "def center_crop(img, out_height, out_width):\n",
    "    height, width, _ = img.shape\n",
    "    left = int((width - out_width) / 2)\n",
    "    right = int((width + out_width) / 2)\n",
    "    top = int((height - out_height) / 2)\n",
    "    bottom = int((height + out_height) / 2)\n",
    "    img = img[top:bottom, left:right]\n",
    "    return img\n",
    "\n",
    "\n",
    "def resize_with_aspectratio(img, out_height, out_width, scale=87.5, inter_pol=cv2.INTER_LINEAR):\n",
    "    height, width, _ = img.shape\n",
    "    new_height = int(100. * out_height / scale)\n",
    "    new_width = int(100. * out_width / scale)\n",
    "    if height > width:\n",
    "        w = new_width\n",
    "        h = int(new_height * height / width)\n",
    "    else:\n",
    "        h = new_height\n",
    "        w = int(new_width * width / height)\n",
    "    img = cv2.resize(img, (w, h), interpolation=inter_pol)\n",
    "    return img\n",
    "\n",
    "\n",
    "def pre_process_edgetpu(img, dims):\n",
    "    output_height, output_width, _ = dims\n",
    "    img = resize_with_aspectratio(img, output_height, output_width, inter_pol=cv2.INTER_LINEAR)\n",
    "    img = center_crop(img, output_height, output_width)\n",
    "    img = np.asarray(img, dtype='float32')\n",
    "    img -= [127.0, 127.0, 127.0]\n",
    "    img /= [128.0, 128.0, 128.0]\n",
    "    return img\n",
    "\n",
    "\n",
    "# read the image\n",
    "fname = \"panda.jpg\"\n",
    "img = cv2.imread(fname)\n",
    "img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n",
    "\n",
    "# pre-process the image like mobilenet and resize it to 300x300\n",
    "img = pre_process_edgetpu(img, (224, 224, 3))\n",
    "plt.axis('off')\n",
    "plt.imshow(img)\n",
    "plt.show()\n",
    "\n",
    "# create a batch of 1 (that batch size is buned into the saved_model)\n",
    "img_batch = np.expand_dims(img, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load the model\n",
    "sess = rt.InferenceSession(MODEL + \".onnx\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "388 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens 0.99857914\n",
      "296 American black bear, black bear, Ursus americanus, Euarctos americanus 0.0004527254\n",
      "294 cheetah, chetah, Acinonyx jubatus 0.00033851538\n",
      "295 brown bear, bruin, Ursus arctos 0.00018831895\n",
      "387 African elephant, Loxodonta africana 3.0347202e-05\n"
     ]
    }
   ],
   "source": [
    "# run inference and print results\n",
    "results = sess.run([\"Softmax:0\"], {\"images:0\": img_batch})[0]\n",
    "result = reversed(results[0].argsort()[-5:])\n",
    "# result = np.argmax(results, axis=1)\n",
    "for r in result:\n",
    "    print(r, labels[str(r-1)], results[0][r])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
